/*
 * @Author: hemenghao
 * @Date: 2023-03-01 17:20:09
 * @LastEditors: hemenghao
 * @LastEditTime: 2023-03-2 15:37:33
 * @Description: websocket连接工具
 */

import { ElMessage, ElLoading, ElMessageBox, ElNotification } from 'element-plus'
import 'element-plus/es/components/message/style/css'
import config from './config'
import useUserStore from '@/store/modules/user'

let socket = null // 连接对象
let linkFailCount = 0 // 连接次数，目前连接三次
let relinkLoading = null // 重连全屏loading

/**
 * @description: 初始化websocket
 * @param {*} linkUrl url的地址
 * @return {WebSocket} WebSocket对象
 * @Author: hemenghao
 */
function initWebSocket () {
    const userStore = useUserStore()
    // 正在连接或连接成功
    if (socket && socket.readyState < 2) {
        return socket
    }
    const url = config.url + userStore.userId
    socket = new WebSocket(url) // 创建对象
    // socket.onerror = webSocketOnError // 连接错误处理
    // socket.onclose = closeWebsocket // 连接关闭处理
    socket.onopen = openWebsocket // 连接打开处理
    socket.onmessage = webscoketDealData
    return socket
}

/**
 * @description: 处理websocket返回的数据
 * @param {*} res 后端返回的数据
 * @return {Object<JSON>}
 * @Author: hemenghao
 */
function webscoketDealData (res, type) {
    const userStore = useUserStore()
    if (!res) return 'null'
    if (res.data == 'SUCCESS') {
        ElNotification({
            type: 'success',
            title: '消息提示',
            message: h('p', { style: 'color: red' }, '已成功连接服务器！'),
            duration: 3000,
            position: 'top-right'
        })
        return
    }
    const result = JSON.parse(res.data)
    if (result.alarmWay && result.alarmWay == 2) {
        ElNotification({
            type: 'warning',
            title: `消息类型： ${result.messageTypeDict}`,
            dangerouslyUseHTMLString: true,
            message: `<div style="color:red">消息内容：${result.message}</div>
        <div style=" margin-top:10px ;">告警时间：${result.today}</div>`,
            duration: 5000,
            position: 'bottom-right'
        })
        // 触发socket 改变缓存值 便于监听
        userStore.changeSocket()
        // 触发消息数量接口
        userStore.setMsgTotal()

        return result
    } else {
        userStore.changeSocket()
    }
}

/**
 * @description: 连接错误回调函数处理
 * @param {*} e 错误对象
 * @Author: hemenghao
 */
function webSocketOnError (e) {
    closeWebsocket()
    linkFailCount++ // 连接失败的次数
    if (relinkLoading) {
        relinkLoading.close() // 关闭重连加载动画
    }
    //连接三次
    if (linkFailCount < 3) {
        // 开启重连加载动画
        relinkLoading = ElLoading.service({
            lock: true,
            text: `第${linkFailCount}次连接失败，正在尝试第${linkFailCount + 1}次重新连接，请稍等...`
        })
    } else {
        ElMessageBox.confirm('连接失败，是否尝试刷新？', '警告', {
            confirmButtonText: '刷新',
            cancelButtonText: '取消',
            type: 'warning',
            'close-on-click-modal': false
        }).then(e => {
            if (e == 'confirm') {
                location.reload()
            }
        })
    }
}

/**
 * @description: 打开websocket回调函数处理
 * @return {*}
 * @Author: hemenghao
 */
function openWebsocket () {
    // console.log('WebSocket连接打开...')
    linkFailCount = 0 // 打开连接，连接次数改为0
    // 加载动画如果开启，则关闭
    if (relinkLoading) {
        relinkLoading.close()
    }
}

/**
 * @description: 关闭websocket回调函数处理
 * @return {*}
 * @Author: hemenghao
 */
function closeWebsocket () {
    // 连接关闭时，立刻开启重连机制
    if (linkFailCount < 3 && socket && socket.readyState >= 2) {
        // 开启重连加载动画
        relinkLoading = ElLoading.service({
            lock: true,
            text: `连接关闭了，正在重连，请稍等...`
        })
        initWebSocket()
    }
}

export default { initWebSocket, webscoketDealData }